<template>
  <Editor v-model="myValue" :init="init" :disabled="disabled" :id="tinymceId"></Editor>
</template>

<script setup>
//JS部分
//在js中引入所需的主题和组件
import tinymce from "tinymce/tinymce";
import "tinymce/skins/content/default/content.css";
import Editor from "@tinymce/tinymce-vue"; //引入tinymce编辑器
import "tinymce/themes/silver"; //编辑器主题，不引入则报错
import "tinymce/themes/silver/theme";
import "tinymce/icons/default/icons.min.js"; //引入编辑器图标icon，不引入则不显示对应图标
import "tinymce/models/dom"; // 这里是个坑 一定要引入

//在TinyMce.vue中接着引入相关插件
import "tinymce/plugins/media"; // 插入视频插件
import "tinymce/plugins/table"; // 插入表格插件
import "tinymce/plugins/image"; // 插入上传图片插件
import "tinymce/plugins/lists"; // 列表插件
import "tinymce/plugins/wordcount"; // 字数统计插件
import "tinymce/plugins/code"; // 插入代码源码
import "tinymce/plugins/fullscreen"; //全屏
// import "tinymce/plugins/help"; //帮助
import "tinymce/plugins/codesample"; //代码示例
import "tinymce/plugins/preview"; //预览
import "tinymce/plugins/searchreplace"; //查找替换
import "tinymce/plugins/autolink"; //自动链接
import "tinymce/plugins/directionality"; //文字方向
import "tinymce/plugins/visualblocks"; //显示元素范围
import "tinymce/plugins/visualchars"; //显示不可见字符
import "tinymce/plugins/link"; //超链接
// import "tinymce/plugins/template" //内容模板
import "tinymce/plugins/charmap"; //特殊字符
import "tinymce/plugins/pagebreak"; //插入分页符
import "tinymce/plugins/nonbreaking"; //插入不间断空格
import "tinymce/plugins/anchor"; //锚点
import "tinymce/plugins/insertdatetime"; //插入日期时间
import "tinymce/plugins/advlist"; //高级列表
import "tinymce/plugins/wordcount"; //字数统计
// import "tinymce/plugins/autosave"//自动存稿
// import "tinymce/plugins/emoticons"//表情

//接下来定义编辑器所需要的插件数据
import { reactive, ref, getCurrentInstance } from "vue";
import { onMounted, defineEmits, watch } from "@vue/runtime-core";
import { compressAccurately } from "image-conversion";
const { proxy } = getCurrentInstance();
const emits = defineEmits(["getContent"]);
//这里我选择将数据定义在props里面，方便在不同的页面也可以配置出不同的编辑器，当然也可以直接在组件中直接定义
const props = defineProps({
  value: {
    type: String,
    default: () => {
      return "";
    },
  },
  baseUrl: {
    type: String,
    default: "",
  },
  disabled: {
    type: Boolean,
    default: false,
  },
});
//用于接收外部传递进来的富文本
const myValue = ref(props.value);
const tinymceId = ref(
  "vue-tinymce-" + +new Date() + ((Math.random() * 1000).toFixed(0) + "")
);
//定义一个对象 init初始化
const init = reactive({
  selector: "#" + tinymceId.value, //富文本编辑器的id,
  language_url: "tinymce/langs/zh-Hans.js", // 语言包的路径，具体路径看自己的项目，文档后面附上中文js文件
  language: "zh-Hans", //语言
  skin_url: "tinymce/skins/ui/oxide", // skin路径，具体路径看自己的项目
  height: 400, //编辑器高度
  promotion: false, //tinymce 去掉 ⚡️Upgrade 按钮
  branding: false, //是否禁用“Powered by TinyMCE”
  menubar: true, //顶部菜单栏显示
  image_dimensions: false, //去除宽高属性
  // plugins: props.plugins,  //这里的数据是在props里面就定义好了的
  // toolbar: props.toolbar, //这里的数据是在props里面就定义好了的
  plugins:
    "codesample preview searchreplace autolink directionality visualblocks visualchars fullscreen image link media code codesample table charmap pagebreak nonbreaking anchor insertdatetime advlist lists wordcount ", //插件配置 axupimgs indent2em  autosave
  toolbar: [
    //codesample
    "fullscreen undo redo restoredraft| cut copy paste pastetext | fontsize forecolor backcolor bold italic underline strikethrough link anchor | alignleft aligncenter alignright alignjustify outdent indent | bullist numlist | blockquote subscript superscript removeformat ",
    "formatselect",
    "table image axupimgs media  charmap pagebreak insertdatetime  selectall visualblocks searchreplace | code preview | indent2em lineheight formatpainter hr ",
  ],

  font_formats:
    "Arial=arial,helvetica,sans-serif; 宋体=SimSun; 微软雅黑=Microsoft Yahei; Impact=impact,chicago;", //字体
  fontsize_formats: "11px 12px 14px 16px 18px 24px 36px 48px 64px 72px", //文字大小
  paste_convert_word_fake_lists: true, // 插入word文档需要该属性
  paste_webkit_styles: "all",
  paste_merge_formats: true,
  nonbreaking_force_tab: false,
  paste_auto_cleanup_on_paste: false,
  file_picker_types: "file",
  content_css: "tinymce/skins/content/default/content.css", //以css文件方式自定义可编辑区域的css样式，css文件需自己创建并引入
  //图片上传
  images_upload_handler: (blobInfo, success, failure) =>
    new Promise(async (resolve, reject) => {
      console.log("blobInfo", blobInfo, "success", success, "failure", failure);
      let result;
      /**
       * 判断文件是否小于0.2M
       */
      console.log(blobInfo.blob().size, blobInfo.blob().size / 1024 / 1024);
      if (blobInfo.blob().size / 1024 / 1024 < 0.2) {
        result = await compressAccurately(blobInfo.blob(), 200).then((res) => {
          // The res in the promise is a compressed Blob type (which can be treated as a File type) file;
          //resolve(res)
          console.log({ ...res, name: blobInfo.blob().name });
          //console.log(new window.File([res, blobInfo.blob().name, {type: blobInfo.blob().type}]))
          let files = new File([res], blobInfo.blob().name, {
            type: blobInfo.blob().type,
          });
          return files;
        });
      } else {
        console.log("未压缩");
        result = blobInfo.blob();
      }
      let params = new FormData();
      params.append("file", result);
      proxy.$emit("submitImg", params, (data) => {
        if (data.code == 200) {
          console.log("submitImgCallback", data);
          resolve(data.data); //上传成功，在成功函数里填入图片路径
        } else {
          reject(data.msg);
          return;
        }
      });
      // richTtextUpload(params)
      //   .then((res) => {
      //     console.log("richTtextUpload", res);
      //     if (res.code == 200) {
      //       ElMessage.success(res.msg);
      //       //http://localhost:6500/static/upload/90b8175337c4051e62162ea41a9b8cde.png
      //       let reslut = `http://localhost:6500${res.data}`;
      //       console.log("reslut", reslut);
      //       resolve(reslut); //上传成功，在成功函数里填入图片路径
      //     }
      //   })
      //   .catch(() => {
      //     reject("上传出错，服务器开小差了呢");
      //     return;
      //   });
    }),

  // 文件上传
  file_picker_callback: (callback, value, meta) => {
    // Provide file and text for the link dialog
    if (meta.filetype == "file") {
      callback("mypage.html", { text: "My text" });
    }

    // Provide image and alt text for the image dialog
    if (meta.filetype == "image") {
      callback("myimage.jpg", { alt: "My alt text" });
    }

    // Provide alternative source and posted for the media dialog
    if (meta.filetype == "media") {
      callback("movie.mp4", { source2: "alt.ogg", poster: "image.jpg" });
    }
  },
});

//工具函数
const getBase64 = (img, callback) => {
  const reader = new FileReader();
  reader.addEventListener("load", () => callback(reader.result));
  reader.readAsDataURL(img);
};

//监听外部传递进来的的数据变化
watch(
  () => props.value,
  () => {
    myValue.value = props.value;
    emits("getContent", myValue.value);
  }
);
//监听富文本中的数据变化
watch(
  () => myValue.value,
  () => {
    emits("getContent", myValue.value);
  }
);
//在onMounted中初始化编辑器
onMounted(() => {
  tinymce.init({});
});
</script>
<style>
.tox-tinymce-aux {
  z-index: 709826033 !important;
}
.tox-tinymce-inline {
  z-index: 709826032 !important;
}
.tox .tox-form__group--stretched .tox-textarea {
  height: 520px;
}
</style>
